#include "Fifo.h"

volatile int fifo_max_size;
volatile int fifo_front,fifo_rear;
volatile int fifo_count;
buff_type fifo_data[fifo_max_array];

void fifo_init(int size)
{
  fifo_front = fifo_rear = 0;
  fifo_count = 0;
  fifo_max_size = size;
  if(fifo_max_size > fifo_max_array)
    fifo_max_size = fifo_max_array - 1;
}

bool fifo_isempty()
{
  return( fifo_count <= 0 );
}

bool fifo_isfull()
{
    return( fifo_count>=fifo_max_size );
}

void fifo_insert(buff_type x)
{
    if(!fifo_isfull())
    {
        fifo_data[fifo_rear] = x;
        fifo_count++;
        fifo_rear++;
        if(fifo_rear >= fifo_max_size)
            fifo_rear = 0;
    }
}

buff_type fifo_remove()
{
    if(!fifo_isempty())
    {
        buff_type x = fifo_data[fifo_front];
        fifo_front++;
        if(fifo_front >= fifo_max_size)
            fifo_front = 0;
        fifo_count--;
        return(x);
    }
    return(fifo_data[0]);
}

buff_type fifo_read()
{
  if(!fifo_isempty())
  {
    return fifo_data[fifo_front];
  }
  return fifo_data[0];
}  

int fifo_get_size()
{
  return(fifo_count);
}
